读书是改变命运的最好办法

2 线性规划的应用

假设某公司生产两种产品,产品1的利润为10美元/单位,产品2的利润为20美元/单位。工厂每周最多可以工作40小时,生产产品1需要2小时,生产产品2需要1小时。此外,每周原材料的使用量不能超过100单位,生产产品1和产品2分别需要1单位和3单位的原材料。公司希望通过最大化利润来确定每周应该生产多少产品1和产品2。

问题可以表述为:

目标函数

\(\text{Max} \quad 10x_1 + 20x_2\)

约束条件

\(2x_1 + x_2 \leq 40 \quad \text{(时间约束)}\)

\(x_1 + 3x_2 \leq 100 \quad \text{(原材料约束)}\)

\(x_1 \geq 0, \quad x_2 \geq 0 \quad \text{(非负约束)}\)

这个问题可以通过单纯形法或内点法求解,结果将告诉公司如何分配资源以实现最大利润。

1.使用Excel求解

在 Excel 中求解线性规划问题可以使用 规划求解(Solver) 工具。以下是步骤,帮助你在 Excel 中解决上面提到的生产计划优化问题。

步骤 1:输入数据

  1. 打开 Excel,创建一个新的工作表。
  2. 输入如下表格内容:
A B C
1 产品 产品 1 (x1) 产品 2 (x2)
2 利润/单位 10 20
3 生产时间/单位 (小时) 2 1
4 原材料/单位 1 3
5 总时间可用 (小时) 40
6 总原材料可用 (单位) 100
7 生产数量 [空] [空]
8 总利润 [空]

步骤 2:设置公式

  1. 在单元格 C7 中输入变量 x1(产品 1 的生产数量)。

  2. 在单元格 D7 中输入变量 x2(产品 2 的生产数量)。

  3. 在单元格 C8 中输入目标函数总利润的公式,计算公式为:

=C2∗C7+D2∗D7

  1. 这将根据产品 1 和产品 2 的数量计算总利润。

步骤 3:设置约束

  1. 在单元格
C5 和 C6
中分别设置时间和原材料的约束。输入以下公式:
  • 单元格 C5:=C3*C7 + D3*D7(时间约束公式)

  • 单元格 C6:=C4*C7 + D4*D7(原材料约束公式)

    这些公式将计算所用的总时间和总原材料量。

步骤 4:启用规划求解(Solver)

  1. 如果没有启用

规划求解(Solver)

,需要先启用该功能:

  • 点击 文件 -> 选项 -> 加载项 -> 管理:Excel 加载项 -> 点击 转到
  • 勾选 规划求解,然后点击 确定

  • 启动

规划求解:

  • 在菜单栏选择 数据 选项卡,然后点击 规划求解

步骤 5:配置规划求解

  1. 设置目标:在 目标单元格 中选择 C8(即总利润单元格)。

  2. 设置目标为最大值:选择 最大值

  3. 可变单元格:选择 C7:D7,表示产品 1 和产品 2 的生产数量。

  4. 添加约束 :

  5. 点击 添加

    ,在弹出的窗口中添加约束:

    • 约束 1:C5 <= 40 (时间限制)
    • 约束 2:C6 <= 100(原材料限制)
    • 约束 3:C7 >= 0 和 D7 >= 0(非负约束)
  6. 选择求解方法:在 求解方法 中选择 单纯形 LP

步骤 6:运行求解器

  1. 设置完成后,点击 求解 按钮。Excel 会开始计算最优解。
  2. 结果出来后,点击 保持求解结果,然后点击 确定

步骤 7:查看结果

求解完成后,C7 和 D7 单元格将显示最优生产数量,而 C8 单元格将显示最大利润。

这样,你就可以使用 Excel 的规划求解工具来解决线性规划问题了。

2.建模的技巧

在Excel中进行线性规划建模不仅是一个技术过程,也是一门艺术。有效的建模涉及到清晰的结构、简洁的表达以及灵活的分析。以下是一些提高Excel线性规划建模艺术性的建议:

  1. 明确目标与假设

  2. 清晰定义问题:在开始建模之前,确保对问题有深刻的理解。明确目标函数、决策变量和约束条件。

  3. 记录假设:在模型中清晰列出所有假设,这有助于后续分析和沟通。

  4. 结构化设计

  5. 模块化布局:将模型分为几个模块,如数据输入、目标函数、约束条件和结果输出。这样可以提高可读性和可维护性。

  6. 使用表格:利用Excel表格(如Excel的表功能)组织数据,确保数据的清晰性和结构性。

  7. 明智使用命名范围

  8. 使用命名范围:将重要的单元格(如参数和变量)命名,使公式更加直观和易于理解。例如,可以将利润系数命名为“利润_A”和“利润_B”,而不是使用单元格引用。

  9. 公式的简洁性

  10. 简化公式:尽量将公式简化,使其易于理解。避免使用过于复杂的嵌套函数,尽量保持公式的直观性。

  11. 分步骤计算:如果公式复杂,可以分解成多个步骤,每个步骤使用独立的单元格计算,然后在最终公式中引用这些中间结果。

  12. 视觉化与反馈

  13. 使用图表:通过图表展示关键数据和结果,使模型更加直观。可以使用条形图、饼图等来表示决策结果或约束的使用情况。

  14. 条件格式:利用条件格式高亮显示关键结果,帮助决策者快速识别重要信息和异常值。

  15. 进行敏感性分析

  16. 灵活性测试:设计模型时考虑不同情境,利用数据表或场景管理器进行What-If分析,探讨输入变化对输出的影响。

  17. 记录结果:清晰记录不同情况下的结果,便于后续决策和讨论。

  18. 增强可用性与交互性

  19. 创建用户友好的界面:通过格式化和布局,使用户能够轻松输入数据和查看结果。使用下拉列表、复选框等控件提高交互性。

  20. 注释和指导:在关键区域添加注释,指导用户如何使用模型,解释各个部分的意义。

  21. 版本控制与文档化

  22. 保留不同版本:定期保存不同版本的工作簿,便于跟踪模型的演变和历史。

  23. 全面文档化:记录模型的创建过程、假设、结果及其意义,确保他人在需要时可以理解和复现模型。

  24. 实践与学习

  25. 不断迭代:在使用过程中不断优化和改进模型,学习新的技巧和方法。

  26. 参与社区:参与Excel相关的论坛或社区,分享经验,学习他人的最佳实践和技巧。

结论

在Excel中进行线性规划建模不仅需要技术能力,还需要艺术性的设计和清晰的沟通。通过结构化设计、灵活的表达、有效的视觉化和敏感性分析,可以创建出既强大又用户友好的模型。这种艺术不仅提升了模型的实用性,也帮助决策者做出更明智的选择。

3.Python求解

可以使用 Python 的 scipy.optimize 模块中的 linprog 函数来求解线性规划问题。以下是使用该工具解决上述问题的示例:

python


复制代码
from scipy.optimize import linprog

# 定义目标函数的系数
c = [-10, -20]  # 由于linprog是求最小值问题,所以目标函数系数取负值

# 定义约束矩阵和右侧的常数
A = [[2, 1], [1, 3]]
b = [40, 100]

# 定义非负约束
x0_bounds = (0, None)
x1_bounds = (0, None)

# 求解线性规划问题
res = linprog(c, A_ub=A, b_ub=b, bounds=[x0_bounds, x1_bounds], method='simplex')

print(f"Optimal value: {-res.fun}")
print(f"x1 = {res.x[0]}, x2 = {res.x[1]}")

这个代码将输出公司应该生产的最优产品数量,以实现最大利润。